package com.zimmor.pool;

import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * @Author:zimmor
 * @Date: 2023/3/13 16:30
 * @Description 通过ThreadPoolExecutor创建线程池，也是最原始的创建线程池的方式
 * @version: 1.0.0
 */

public class ThreadPoolExecutorNewThreadPool {
    public static void main(String[] args) {
        //创建一个线程池
        /**
         *参数含义
         * param1 核心线程数
         * param2 最大可用线程数
         * param3 时间
         * param4 单位，和param3配合使用
         * param5 阻塞队列，用来保存，线程池要执行的任务，均为线程安全
         * param6 线程工厂，用来创建线程，默认为正常优先级、非守护线程
         * param7 拒绝策略，拒绝处理任务时的策略，有以下四种策略
         *      AbortPolicy：拒绝并抛出异常。
         *      CallerRunsPolicy：使用当前调用的线程来执行此任务。
         *      DiscardOldestPolicy：抛弃队列头部（最旧）的一个任务，并执行当前任务。
         *      DiscardPolicy：忽略并抛弃当前任务。
         *      默认策略为 AbortPolicy。
         *      自定义策略就是重写RejectedExecutionHandler类的rejectedExecution(Runnable r, ThreadPoolExecutor executor)方法
         */
        ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, 10, 3, TimeUnit.MINUTES, new LinkedBlockingQueue<>(10), Executors.defaultThreadFactory(), new ThreadPoolExecutor.CallerRunsPolicy());
        //使用线程池来调度线程
        for (int i = 0; i < 100; i++) {
            threadPool.execute(new Runnable() {
                @Override
                public void run() {
                    System.out.println("threadPool = " + Thread.currentThread().getName());
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            });
        }
    }
}
